home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / SERIAL.TST / SERLTST.C < prev    next >
C/C++ Source or Header  |  1996-03-26  |  4KB  |  120 lines

  1. /* ============ */
  2. /* serltst.c    */
  3. /* ============ */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <miscdefs.h>
  8. #include <serldefs.h>
  9. #include <mconf.h>
  10.  
  11. #define    NUM_PROBS    100
  12. #define LOW_PROB    1.0e-8
  13.  
  14. static    SERIAL_DATA_STRU SerialData;
  15. static    INIT_DATA_STRU   InitialData;
  16.  
  17. #define    FULL_SIZE  ((unsigned)RAND_MAX + 1U)
  18. UINT WorkArea[FULL_SIZE];
  19.  
  20. /* ==================================================================== */
  21. /* SerialTest - Executes Serial Test per Knuth, Vol 2 (1981), p. 60    */
  22. /* ==================================================================== */
  23. void
  24. main(void)
  25. {
  26.     int        k;
  27.     long    TotVariates = 0;
  28.     double  DegFree, LoLimit, HiLimit;
  29.     double  KnMinusProb, KnMinusStat, KnPlusProb, KnPlusStat;
  30.  
  31.     double  ChiSqProb[NUM_PROBS];
  32.  
  33.     AbortGracefully();            /* Make ^C act reasonably */
  34.  
  35.     printf("\tS E R I A L  T E S T\n\n");
  36.     GetInitialData(&InitialData);
  37.  
  38.     /* -------------------------- */
  39.     /* Print Initial Data Entries */
  40.     /* -------------------------- */
  41.     printf("\nStarting Seed = %u%s\n", InitialData.UserSeed,
  42.     (InitialData.SeedSrce == (UINT)(-1)) ?
  43.         " (Unsigned Integer Part of Time of Day)" : "");
  44.  
  45.     printf("Generator     = %s\n", InitialData.GenName);
  46.  
  47.     /* -------------------------------------- */
  48.     /* Set Address of Random Number Generator */
  49.     /* -------------------------------------- */
  50.     SerialData.RandFun = InitialData.RandFun;
  51.  
  52.     /* --------------------------------------------- */
  53.     /* Initialize Control Parameters for Serial Test */
  54.     /* --------------------------------------------- */
  55.     SetSerialControls(&SerialData);
  56.  
  57.     /* -------------------------- */
  58.     /* Initialize Variate Counter */
  59.     /* -------------------------- */
  60.     SerialData.TotNumGen = 0;
  61.  
  62.     DegFree = SerialData.NumCategories - 1;
  63.     ChiSqDist(LOW_PROB, DegFree, &LoLimit, &HiLimit);
  64.  
  65.     fflush(NULL);
  66.     /* ------------------------- */
  67.     /* Generate Random Numbers,  */
  68.     /* Calculate Chi-Square Data */
  69.     /* ------------------------- */
  70.     for (k = 0; k < NUM_PROBS; ++k)
  71.     {
  72.     CalcSerialChiSq(&SerialData);
  73.  
  74.     fprintf(stderr, "\rPass %3d (of %d), %8ld  Total Random Numbers",
  75.         k+1, NUM_PROBS, SerialData.TotNumGen);
  76.  
  77.     if (SerialData.SerialChiSq <= LoLimit)
  78.     {
  79.         ChiSqProb[k] = LOW_PROB;
  80.     }
  81.     else if (SerialData.SerialChiSq >= HiLimit)
  82.     {
  83.         ChiSqProb[k] = 1.0 - LOW_PROB;
  84.     }
  85.     else
  86.     {
  87.         ChiSqProb[k] = chdtr(DegFree, SerialData.SerialChiSq);
  88.     }
  89.     if (ChiSqProb[k] < 0)
  90.     {
  91.         fprintf(stderr, "\nChiSqFreq(): Function chdtr() "
  92.         "Returned Negative Probability -  Can't Happen.\n");
  93.     }
  94.     P(printf("Serial Chi-Square Statistic = %f\n",
  95.        SerialData.SerialChiSq));
  96.     P(printf("Chi-Square Probability on %.f"
  97.         " Degrees of Freedom = %.4f\n", DegFree, ChiSqProb[k]));
  98.     }
  99.  
  100.     /* -------------------------------------------------------- */
  101.     /* Calculate K-S on Chi-Square Statistics and Probabilities */
  102.     /* -------------------------------------------------------- */
  103.     fflush(NULL);
  104.     KSCalc(ChiSqProb, NUM_PROBS,
  105.         &KnPlusStat, &KnPlusProb,
  106.          &KnMinusStat, &KnMinusProb);
  107.  
  108.    printf("\n\nKolmogorov-Smirnov Statistics and Probabilities"
  109.     " on Chi-Square Data\n");
  110.  
  111.    printf("\tK(%d)+ = %f (Knuth) or %9f%%\n", NUM_PROBS,
  112.     sqrt((double)NUM_PROBS)*KnPlusStat, 100*KnPlusProb);
  113.  
  114.    printf("\tK(%d)- = %f (Knuth) or %9f%%\n", NUM_PROBS,
  115.     sqrt((double)NUM_PROBS)*KnMinusStat, 100*KnMinusProb);
  116.  
  117.     printf("\nThis Run Required %ld Random Numbers\n",
  118.     SerialData.TotNumGen);
  119. }
  120.